package com.eks.excel.controller;

import cn.gjing.tools.excel.ExcelFactory;
import com.eks.excel.vo.MultiHead;
import com.eks.excel.vo.SingleHead;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * ExcelController
 *
 * https://github.com/archine/tools/tree/master/tools-excel
 *
 * @author: chenfenghai
 * @version: 1.0
 * @date: 2021-01-15 15:41
 */
@RestController
public class ExcelController {

    @GetMapping("/test")
    public String test(){
        return "test";
    }

    @GetMapping("/test_export")
    public void testExport(HttpServletResponse response) {
        //指定映射的实体为刚刚定义的
        ExcelFactory.createWriter(SingleHead.class, response)
                .write(SingleHead.getSingleHeadList())
                .flush();
    }

    @GetMapping("/test_export2")
    public void testExportMulti(HttpServletResponse response) {
        ExcelFactory.createWriter(MultiHead.class, response)
                //需要在write前激活多级表头，否则不会自动合并
                .multiHead(true)
                .write(MultiHead.getMultiHeadList())
                .flush();
    }

    @PostMapping("/post")
    public void userExcel(@RequestParam(name = "file" ,required = false) MultipartFile file) {
        System.out.println("file===>"+file);
//        JsonArray array=null;
//        String fileName = file.getName().toLowerCase();
//        Workbook workbook=null;
//        if(fileName.endsWith(".xlsx")){
//          workbook=new XSSFWorkbook(new FileInputStream((File) file));
//        }else if (fileName.endsWith(".xls")) {
//            POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
//            workbook = new HSSFWorkbook(poifsFileSystem);
//        }
//        array= Read(workbook);
        ExcelFactory.createReader(file, SingleHead.class)
                //在read()方法前通过订阅方法增加一个结果监听器，该监听器会在每一次read()结束之后触发
                //如果Excel中数据量太大，不建议使用结果监听器，会造成生成了过多的映射实体对象造成内存溢出
                .subscribe(this::saveUser)
                .read()
                .finish();
    }

    @PostMapping("/user_import")
    public void userImport(MultipartFile file) {
        // 前文有提到多级表头时，最后一级为实际表头，所以要在导入时指定实际表头开始下标，
        // 由于导出的模板映射实体设置两级表头，因此这里的实际表头为下标为1(Excel行和列下标都是默认0开始的)
        ExcelFactory.createReader(file, SingleHead.class)
                //在read()方法前通过订阅方法增加一个结果监听器，该监听器会在每一次read()结束之后触发
                //如果Excel中数据量太大，不建议使用结果监听器，会造成生成了过多的映射实体对象造成内存溢出
                .subscribe(this::saveUser)
                .read(1)
                .finish();
    }

    private void saveUser(List<SingleHead> singleHead){

    }
}
